package com.jason.fontmetrics.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ComposePathEffect;
import android.graphics.CornerPathEffect;
import android.graphics.DashPathEffect;
import android.graphics.DiscretePathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathDashPathEffect;
import android.graphics.PathEffect;
import android.graphics.SumPathEffect;
import android.util.AttributeSet;
import android.view.View;

/**
 * @DESC: http://blog.csdn.net/aigestudio/article/details/41447349
 * @Author: Jason
 * @Date: 16/8/29
 * @Time: 23:25
 */

public class PathEffectView7 extends View {

    private float mPhase; // 偏移值
    private Paint mPaint; // 画笔对象
    private Path mPath; // 路径对象
    private PathEffect[] mEffects; // 路径效果数组

    public PathEffectView7(Context context) {
        this(context, null);
    }

    public PathEffectView7(Context context, AttributeSet attrs) {
        super(context, attrs);

        // 实例化画笔并设置参数
        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(5);
        mPaint.setColor(Color.DKGRAY);

        // 实例化路径
        mPath = new Path();

        // 定义路径的起点
        mPath.moveTo(0, 0);

        // 定义路径的各个点
        for (int i = 0; i <= 30; i++) {
            mPath.lineTo(i * 35, (float) (Math.random() * 100));
        }

        // 创建路径效果数组
        mEffects = new PathEffect[7];
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 实例化各类特效
        mEffects[0] = null;
        // CornerPathEffect的构造方法只接受一个参数radius，意思就是转角处的圆滑程度
        mEffects[1] = new CornerPathEffect(50);

        // DiscretePathEffect离散路径效果相对来说则稍微复杂点，其会在路径上绘制很多“杂点”的突出来模拟一种类似生锈铁丝的效果如上图第三条线
        // 其构造方法有两个参数，第一个呢指定这些突出的“杂点”的密度，值越小杂点越密集，第二个参数呢则是“杂点”突出的大小，值越大突出的距离越大反之反之
        mEffects[2] = new DiscretePathEffect(3.0f, 5.0f);

        /**
         * 第一个参数是一个浮点型的数组
         *
         * 从图中我们可以看到我们之前的那种线条变成了一长一短的间隔线条，而float[] {20, 10}的偶数参数20
         * （注意数组下标是从0开始哦）定义了我们第一条实线的长度，而奇数参数10则表示第一条虚线的长度，
         * 如果此时数组后面不再有数据则重复第一个数以此往复循环，比如我们20,10后没数了，
         * 那么整条线就成了[20,10,20,10,20,10…………………………]这么一个状态，当然如果你无聊，也可以
         *
         * mEffects[3] = new DashPathEffect(new float[] {20, 10, 50, 5, 100, 30, 10, 5}, mPhase);
         *
         * 第二个参数我称之为偏移值
         */
        mEffects[3] = new DashPathEffect(new float[]{20, 10, 5, 10}, mPhase);


        /**
         *  PathDashPathEffect和DashPathEffect是类似的
         *  不同的是PathDashPathEffect可以让我们自己定义路径虚线的样式，比如我们将其换成一个个小圆组成的虚线
         *  Path path = new Path();
            path.addCircle(0, 0, 3, Direction.CCW);
            mEffects[4] = new PathDashPathEffect(path, 12, mPhase, PathDashPathEffect.Style.ROTATE);
         *
         */
        Path path = new Path();
        path.addRect(0, 0, 8, 8, Path.Direction.CCW);

        mEffects[4] = new PathDashPathEffect(path, 12, mPhase, PathDashPathEffect.Style.ROTATE);

        /**
         * ComposePathEffect和SumPathEffect都可以用来组合两种路径效果，唯一不同的是组合的方式，
         * ComposePathEffect(PathEffect outerpe, PathEffect innerpe)会先将路径变成innerpe的效果，再去复合outerpe的路径效果，即：outerpe(innerpe(Path))；
         * SumPathEffect(PathEffect first, PathEffect second)则会把两种路径效果加起来再作用于路径
         */

        mEffects[5] = new ComposePathEffect(mEffects[2], mEffects[3]);
        mEffects[6] = new SumPathEffect(mEffects[4], mEffects[3]);

        // 绘制路径
        for (int i = 0; i < mEffects.length; i++) {
            mPaint.setPathEffect(mEffects[i]);
            canvas.drawPath(mPath, mPaint);
            // 每绘制一条将画布向下平移250个像素
            canvas.translate(0, 250);
        }

        // 刷新偏移值并重绘视图实现动画效果
        mPhase += 1;
        invalidate();


    }
}
